package cn.thornbird.orgsync.model.feishu;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.IOException;
import java.util.Date;
import java.util.List;

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserList extends Response {

    @JsonProperty("data")
    private PageableData<User> data;


    @Data
    public static class User {

        /**
         * 用户的union_id, 是应用开发商发布的不同应用中同一用户的标识
         */
        @JsonProperty("union_id")
        private String unionId;

        /**
         * 用户的user_id, 租户内用户的唯一标识
         */
        @JsonProperty("user_id")
        private String userId;

        /**
         * 用户的open_id, 应用内用户的唯一标识
         */
        @JsonProperty("open_id")
        private String openId;

        /**
         * 用户名称
         */
        @JsonProperty("name")
        private String name;

        /**
         * 英文名
         */
        @JsonProperty("en_name")
        private String englishName;

        /**
         * 别名
         */
        @JsonProperty("nickname")
        private String nickname;

        /**
         * 邮箱
         */
        @JsonProperty("email")
        private String email;

        /**
         * 手机号
         */
        @JsonProperty("mobile")
        private String mobile;

        /**
         * 手机号是否可见: true-可见, false-不可见
         */
        @JsonProperty("mobile_visible")
        private Boolean mobileVisible;

        /**
         * 性别: 0-保密, 1-男, 2-女, 3-其他
         */
        @JsonProperty("gender")
        private Integer gender;

        /**
         * 头像的文件Key
         */
        @JsonProperty("avatar_key")
        private String avatarKey;

        /**
         * 用户头像信息
         */
        @JsonProperty("avatar")
        private TenantInfo.Avatar avatar;

        /**
         * 用户状态
         */
        @JsonProperty("status")
        private UserStatus status;

        /**
         * 用户所属部门的ID列表
         */
        @JsonProperty("department_ids")
        private List<String> departmentIds;

        /**
         * 用户的直接主管的用户ID
         */
        @JsonProperty("leader_user_id")
        private String leaderUserId;

        /**
         * 工作城市
         */
        @JsonProperty("city")
        private String city;

        /**
         * 国家或地区Code缩写, 示例值: CN
         */
        @JsonProperty("country")
        private String country;

        /**
         * 工位, 字符长度上限为255
         */
        @JsonProperty("work_station")
        private String workStation;

        /**
         * 入职时间
         */
        @JsonProperty("join_time")
        @JsonDeserialize(using = UserList.TimestampDeserializer.class)
        private Date joinTime;

        /**
         * 用户是否为租户超级管理员
         */
        @JsonProperty("is_tenant_manager")
        private Boolean isTenantManager;

        /**
         * 工号, 字符长度上限为255
         */
        @JsonProperty("employee_no")
        private String employeeNo;

        /**
         * 员工类型: 1-正式员工, 2-实习生, 3-外包, 4-劳务, 5-顾问
         */
        @JsonProperty("employee_type")
        private Integer employeeType;

        /**
         * 用户排序信息列表
         */
        @JsonProperty("orders")
        private List<UserOrder> orders;

        /**
         * 自定义字段
         */
        @JsonProperty("custom_attrs")
        private List<UserCustomAttr> customAttrs;

        /**
         * 企业邮箱
         */
        @JsonProperty("enterprise_email")
        private String enterpriseEmail;

        /**
         * 职务名称, 字符数量上限为255
         */
        @JsonProperty("job_title")
        private String jobTitle;

        /**
         * 是否为暂停状态的用户
         */
        @JsonProperty("is_frozen")
        private Boolean isFrozen;

        /**
         * 数据驻留地
         */
        @JsonProperty("geo")
        private String geo;

        /**
         * 职级ID
         */
        @JsonProperty("job_level_id")
        private String jobLevelId;

        /**
         * 序列ID
         */
        @JsonProperty("job_family_id")
        private String jobFamilyId;

        /**
         * 部门路径
         */
        @JsonProperty("department_path")
        private List<DepartmentList.DepartmentDetail> departmentPath;

        /**
         * 虚线上级的用户ID列表
         */
        @JsonProperty("dotted_line_leader_user_ids")
        private List<String> dottedLineLeaderUserIds;

        /**
         * 分配给用户的席位ID列表
         */
        @JsonProperty("subscription_ids")
        private List<String> subscriptionIds;

    }


    @Data
    public static class UserStatus {

        @JsonProperty("is_frozen")
        private Boolean isFrozen;

        @JsonProperty("isResigned")
        private Boolean isResigned;

        @JsonProperty("is_activated")
        private Boolean isActivated;

        @JsonProperty("is_exited")
        private Boolean isExited;

        @JsonProperty("is_unjoin")
        private Boolean isUnjoin;

    }


    @Data
    public static class UserOrder {

        @JsonProperty("department_id")
        private String departmentId;

        @JsonProperty("user_order")
        private Integer userOrder;

        @JsonProperty("department_order")
        private Integer departmentOrder;

        @JsonProperty("is_primary_dept")
        private Boolean isPrimaryDepartment;

    }


    @Data
    public static class UserCustomAttr {

        /**
         * 自定义字段类型 TEXT-文本, HREF-网页, ENUMERATION-枚举, PICTURE_ENUM-图片, GENERIC_USER-用户
         */
        @JsonProperty("type")
        private String type;

        @JsonProperty("id")
        private String id;

        @JsonProperty("value")
        private UserCustomAttrValue value;

    }


    @Data
    public static class UserCustomAttrValue {

        @JsonProperty("text")
        private String text;

        @JsonProperty("url")
        private String url;

        @JsonProperty("pc_url")
        private String pcUrl;

        @JsonProperty("option_id")
        private String optionId;

        @JsonProperty("option_value")
        private String optionValue;

        @JsonProperty("name")
        private String name;

        @JsonProperty("picture_url")
        private String pictureUrl;

        @JsonProperty("generic_user")
        private CustomAttrGenericUser genericUser;

    }


    @Data
    public static class CustomAttrGenericUser {

        @JsonProperty("id")
        private String id;

        /**
         * 用户类型, 目前固定为1, 表示用户类型
         */
        @JsonProperty("type")
        private Integer type;

    }


    public static class TimestampDeserializer extends JsonDeserializer<Date> {

        @Override
        public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            return new Date(parser.getIntValue() * 1000L);
        }

    }

}
